import request from '@/utils/request'
import CryptoJS from 'crypto-js'

// 沙箱环境API基础URL
const SANDBOX_BASE_URL = 'https://api.mch.weixin.qq.com/sandboxnew'

// 正式环境API基础URL
const PROD_BASE_URL = 'https://api.mch.weixin.qq.com'

// 获取沙箱签名密钥
export function getSandboxSignKey(mchId, key) {
  // 生成随机字符串
  const nonceStr = Math.random().toString(36).substr(2, 15)
  
  // 构造请求参数
  const params = {
    mch_id: mchId,
    nonce_str: nonceStr
  }
  
  // 生成签名
  const sign = generateSignature(params, key)
  params.sign = sign
  
  // 转换为XML格式
  const xmlData = jsonToXml(params)
  
  // 发送请求获取沙箱签名密钥
  return new Promise((resolve, reject) => {
    uni.request({
      url: `${SANDBOX_BASE_URL}/pay/getsignkey`,
      method: 'POST',
      data: xmlData,
      header: {
        'Content-Type': 'application/xml'
      },
      success: (res) => {
        if (res.statusCode === 200) {
          // 解析XML响应
          const result = xmlToJson(res.data)
          if (result.return_code === 'SUCCESS' && result.result_code === 'SUCCESS') {
            resolve(result.sandbox_signkey)
          } else {
            reject(new Error(result.err_code || result.return_msg))
          }
        } else {
          reject(new Error(`请求失败，状态码: ${res.statusCode}`))
        }
      },
      fail: (err) => {
        reject(err)
      }
    })
  })
}

// 发起支付请求
export function requestPayment(paymentData, isSandbox = false) {
  const baseUrl = isSandbox ? SANDBOX_BASE_URL : PROD_BASE_URL
  const xmlData = jsonToXml(paymentData)
  
  return new Promise((resolve, reject) => {
    uni.request({
      url: `${baseUrl}/pay/unifiedorder`,
      method: 'POST',
      data: xmlData,
      header: {
        'Content-Type': 'application/xml'
      },
      success: (res) => {
        if (res.statusCode === 200) {
          // 解析XML响应
          const result = xmlToJson(res.data)
          if (result.return_code === 'SUCCESS' && result.result_code === 'SUCCESS') {
            resolve(result)
          } else {
            reject(new Error(result.err_code_des || result.return_msg))
          }
        } else {
          reject(new Error(`请求失败，状态码: ${res.statusCode}`))
        }
      },
      fail: (err) => {
        reject(err)
      }
    })
  })
}

// 生成签名
function generateSignature(params, key) {
  // 按照参数名ASCII码从小到大排序
  const sortedParams = Object.keys(params).sort().reduce((obj, key) => {
    obj[key] = params[key]
    return obj
  }, {})
  
  // 拼接成key=value格式
  const stringA = Object.keys(sortedParams)
    .filter(key => sortedParams[key] !== undefined && sortedParams[key] !== null && sortedParams[key] !== '')
    .map(key => `${key}=${sortedParams[key]}`)
    .join('&')
  
  // 拼接API密钥
  const stringSignTemp = `${stringA}&key=${key}`
  
  // MD5加密并转为大写
  return CryptoJS.MD5(stringSignTemp).toString().toUpperCase()
}

// JSON转XML
function jsonToXml(json) {
  let xml = '<xml>'
  for (const key in json) {
    if (json.hasOwnProperty(key)) {
      xml += `<${key}>${json[key]}</${key}>`
    }
  }
  xml += '</xml>'
  return xml
}

// XML转JSON
function xmlToJson(xml) {
  // 创建一个简单的XML解析器
  const parser = new DOMParser()
  const xmlDoc = parser.parseFromString(xml, 'text/xml')
  const result = {}
  
  // 获取所有子元素
  const elements = xmlDoc.getElementsByTagName('*')
  for (let i = 0; i < elements.length; i++) {
    const element = elements[i]
    // 只处理叶子节点（没有子元素的节点）
    if (element.children.length === 0) {
      result[element.tagName] = element.textContent
    }
  }
  
  return result
}